/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DAO;
import java.sql.*;
import Fachada.Fachada;
import LogicaNegocio.*;
import java.util.Vector;
/**
 *
 * @author GEMA
 */
public class DAOCliente
{
    private Fachada fachada;
    String reporte = "";

    public DAOCliente()
    {
        fachada = new Fachada();
    }

    public int guardarCliente(Cliente cliente)
    {
        String sql_guardar;
        sql_guardar="INSERT INTO Cliente(id_cliente, nombre_cliente, direccion_cliente, ciudad_residencia, pagina_web_cliente, fecha_ingreso_cliente, estado_cliente, email_cliente) VALUES" +
                "('"+ cliente.getIdCliente()+"','"+cliente.getNombreCliente()+"','"+ cliente.getDireccionCliente()+"','"+cliente.getCiudadCliente()+
                "','"+cliente.getPagWeb()+"','"+cliente.getFechaIngresoCliente()+"','"+cliente.getEstadoCliente()+"','"+cliente.getEmail()+"')";

        try
        {
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia=conexion.createStatement();
            int numFilas= sentencia.executeUpdate(sql_guardar);
            conexion.close();
            return numFilas;
        }
        catch(SQLException e)
        {
            System.out.println(e);
        }
        catch(Exception e)
        { System.out.println(e);
        }
        return -1;
    }

    public void consultarTelefono(String telefono)
    {
        String sql_seleccionar;
        sql_seleccionar = "SELECT nombre_cliente " +
                "FROM Cliente NATURAL JOIN TelefonoCliente " +
                "WHERE telefono_cliente = '" + telefono + "'";

         try{
                Connection conexion= fachada.ConexionBaseDatos();
                Statement sentencia = conexion.createStatement();
                ResultSet tabla = sentencia.executeQuery(sql_seleccionar);

                while(tabla.next())
                {
                   System.out.println("Nombre: " + tabla.getString(1));


                }
                conexion.close();
                System.out.println("Conexion cerrada");

            }
             catch(SQLException e)
             {
                 System.out.println(e);
             }
             catch(Exception e){ System.out.println(e); }
     }

    public Vector<Cliente> consultarClientes()
    {
        String sql_select;
        sql_select = "SELECT * FROM VistaClientes";
        Vector <Cliente> clientes = new Vector <Cliente>();

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            
            while(tabla.next())
            {
                Cliente cliente = new Cliente(tabla.getString(1),tabla.getString(2),tabla.getString(3),tabla.getString(4),tabla.getString(5),tabla.getString(6),tabla.getString(7),tabla.getString(8));
                clientes.addElement(cliente);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return clientes;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }

    public int modificarNombreCliente(Cliente cliente)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Cliente "+
                        "SET  nombre_cliente = '" + cliente.getNombreCliente() + "' " +
                        "WHERE id_cliente = '" + cliente.getIdCliente() + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public int modificarDireccionCliente(Cliente cliente)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Cliente "+
                        "SET direccion_cliente = '" + cliente.getDireccionCliente() + "' " +
                        "WHERE id_cliente = '" + cliente.getIdCliente() + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public int modificarCiudadCliente(Cliente cliente)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Cliente "+
                        "SET ciudad_residencia = '" + cliente.getCiudadCliente() + "' " +
                        "WHERE id_cliente = '" + cliente.getIdCliente()+ "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public int modificarPaginaWebCliente(Cliente cliente)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Cliente "+
                        "SET pagina_web_cliente = '" + cliente.getPagWeb() + "' " +
                        "WHERE id_cliente = '" + cliente.getIdCliente() + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public int modificarFechaIngresoCliente(Cliente cliente)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Cliente "+
                        "SET fecha_ingreso_cliente = '" + cliente.getFechaIngresoCliente() + "' " +
                        "WHERE id_cliente = '" + cliente.getIdCliente() + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public int modificarEstadoCliente(Cliente cliente)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Cliente "+
                        "SET estado_cliente = '" + cliente.getEstadoCliente() + "' " +
                        "WHERE id_cliente = '" + cliente.getIdCliente() + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public int modificarEmailCliente(Cliente cliente)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Cliente "+
                        "SET email_cliente = '" + cliente.getEmail() + "' " +
                        "WHERE id_cliente = '" + cliente.getIdCliente() + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public int eliminarCliente(String idCliente)
    {
        String sql_modificar;
        sql_modificar = "DELETE FROM Cliente "+
                        "WHERE id_cliente = " + "'" +idCliente + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public Vector <Vector> nombresClientes()
    {
        String sql_select;
        sql_select = "SELECT id_cliente, nombre_cliente " +
                     "FROM Cliente";
        Vector <Vector> vectorCSC = new Vector <Vector>();

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);

            while(tabla.next())
            {
                Vector <String> descripcion = new Vector <String>();
                descripcion.addElement(tabla.getString(1));
                descripcion.addElement(tabla.getString(2));

                vectorCSC.addElement(descripcion);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return vectorCSC;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }

    public Vector<Vector> reporteClientes(String estadoCliente, String fechaInicio, String fechaFin)
    {
        String sql_select;
        sql_select = "SELECT id_cliente, nombre_cliente";

        if( estadoCliente.equals(""))
        {
            sql_select += ", estado_cliente";
        }


        sql_select +=" FROM Cliente "+
                     "WHERE fecha_ingreso_cliente BETWEEN '"+fechaInicio+"' AND '"+fechaFin+"' ";

        if( !estadoCliente.equals("") )
        {
            sql_select +="AND estado_cliente = '"+estadoCliente+"' ";
        }

        Vector <Vector> vectorCSC = new Vector <Vector>();
        reporte = sql_select;

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);

            while(tabla.next())
            {
                Vector <String> descripcion = new Vector <String>();
                descripcion.addElement(tabla.getString(1));
                descripcion.addElement(tabla.getString(2));

                if( estadoCliente.equals("") )
                {
                    descripcion.addElement(tabla.getString(3));
                }    
                vectorCSC.addElement(descripcion);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return vectorCSC;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }
 
    public Vector <Vector> estadisticasClientes()
    {
        String sql_select;
        sql_select = "SELECT COUNT(*) FROM ("+reporte+")";

        Vector <Vector> vectorCSC = new Vector <Vector>();

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);

            while(tabla.next())
            {
                Vector <String> descripcion = new Vector <String>();
                descripcion.addElement(tabla.getString(1));
                vectorCSC.addElement(descripcion);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return vectorCSC;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }

    public Vector<Vector> consultaParametrizada(String fecha, Vector <String> atributos, Vector <String> valores)
    {
        String sql_select;
        sql_select = "SELECT * FROM Cliente ";

        if(( atributos.size() != 0) || (!fecha.equals("")))
        {
            sql_select += " WHERE ";
        }

        if(!fecha.equals(""))
        {
            sql_select += " fecha_ingreso_cliente = '"+fecha+"' ";

            if(atributos.size() != 0)
            {
                sql_select += "AND ";
            }
        }



        for(int i=0; i<atributos.size(); i++)
        {
            sql_select+= atributos.elementAt(i)+" LIKE '%"+valores.elementAt(i)+"%' ";

            if( (i+1) < atributos.size() )
            {
                sql_select += " AND ";
            }
        }

        System.out.println(sql_select);
        Vector <Vector> clientes = new Vector <Vector>();

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);

            while(tabla.next())
            {
                Vector <String> cliente = new Vector <String>();
                cliente.addElement(tabla.getString(1));
                cliente.addElement(tabla.getString(2));
                cliente.addElement(tabla.getString(3));
                cliente.addElement(tabla.getString(4));
                cliente.addElement(tabla.getString(5));
                cliente.addElement(tabla.getString(6));
                cliente.addElement(tabla.getString(7));
                cliente.addElement(tabla.getString(8));
                clientes.addElement(cliente);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return clientes;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }

    public String consultarNombreCliente(String cc) {

        String sql_select;
        sql_select = "SELECT nombre_cliente " +
                     "FROM Cliente WHERE id_cliente = '" + cc + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);
            String nombre = null;
            while(tabla.next())
            {
                nombre = tabla.getString(1);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return nombre;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }
}
